<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "https://www.w3.org/TR/html4/loose.dtd">
<html lang="zh-CN"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><meta http-equiv="Content-Language" content="zh-CN"><link href="stylesheet.css" media="all" rel="stylesheet" type="text/css">
<title>设置参数</title>
<script> var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?d286c55b63a3c54a1e43d10d4c203e75"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script>
</head><body class="SECT1">
<div>
<table summary="Header navigation table" width="100%" border="0" cellpadding="0" cellspacing="0">
<tr><th colspan="5" align="center" valign="bottom">PostgreSQL 8.2.3 中文文档</th></tr>
<tr><td width="10%" align="left" valign="top"><a href="runtime-config.html" accesskey="P">后退</a></td><td width="10%" align="left" valign="top"><a href="runtime-config.html">快退</a></td><td width="60%" align="center" valign="bottom">章17. 服务器配置</td><td width="10%" align="right" valign="top"><a href="runtime-config.html">快进</a></td><td width="10%" align="right" valign="top"><a href="runtime-config-file-locations.html" accesskey="N">前进</a></td></tr>
</table>
<hr align="LEFT" width="100%"></div>
<div class="SECT1"><h1 class="SECT1"><a name="CONFIG-SETTING">17.1. 设置参数</a></h1>
<p>所有参数名都是大小写不敏感的。每个参数都可以接受四种类型之一：布尔、整数、浮点数、字符串。布尔值可以是(都是大小写无关) <tt class="LITERAL">ON</tt>, <tt class="LITERAL">OFF</tt>, <tt class="LITERAL">TRUE</tt>, <tt class="LITERAL">FALSE</tt>, <tt class="LITERAL">YES</tt>, <tt class="LITERAL">NO</tt>, <tt class="LITERAL">1</tt>, <tt class="LITERAL">0</tt> 或这些东西的任意清晰无歧义的前缀。</p>
<p>一些设置指定内存或时间值，其隐含的单位可能是：kB(千字节)、块(通常是 8KB)、毫秒、秒、分钟等等。隐含单位可以通过引用 <tt class="LITERAL">pg_settings.unit</tt> 获取。为了避免混淆，可以在指定数值的同时指定单位。可用内存单位：<tt class="LITERAL">kB</tt>(千字节), <tt class="LITERAL">MB</tt>(兆字节), <tt class="LITERAL">GB</tt>(吉字节)；可用时间单位：<tt class="LITERAL">ms</tt>(毫秒), <tt class="LITERAL">s</tt>(秒), <tt class="LITERAL">min</tt>(分钟), <tt class="LITERAL">h</tt>(小时), <tt class="LITERAL">d</tt>(天)。内存单位中的"千"等于 1024 ，而不是 1000 。</p>
<p>设置这些参数的一个方法是编辑 <tt class="FILENAME">postgresql.conf</tt> 文件，它通常在数据目录里(<span class="APPLICATION">initdb</span> 会在那里安装一个缺省的拷贝)。比如，下面是一个该文件的例子：</p>
<pre class="PROGRAMLISTING"># 这是一个注释
log_connections = yes
log_destination = 'syslog'
search_path = '"$user", public'
shared_buffers = 128MB</pre>
<p>像你看到的那样，选项是每条一行。选项名和值之间的等号是可选的。空白和空行被忽略。井号(<tt class="LITERAL">#</tt>)引入注释。非简单标识符或者数字必须用单引号包围。如果需要在参数值里嵌入单引号，要么写两个单引号(推荐方法)，要么用反斜扛包围。</p>
<p><a name="AEN19592"></a>除了设置参数以外，<tt class="FILENAME">postgresql.conf</tt> 文件中还可以使用<i class="FIRSTTERM">包含指令</i>在其自身所在位置插入其他文件的内容。包含指令的语法如下：</p>
<pre class="PROGRAMLISTING">include 'filename'</pre>
<p>如果文件名不是绝对路径那么将被当作相对于包含指令所属文件的所在目录。包含可以被嵌套。</p>
<p><a name="AEN19600"></a>主服务器进程每次收到 <span class="SYSTEMITEM">SIGHUP</span> 信号(最简单的发送方法就是使用 <tt class="LITERAL">pg_ctl reload</tt>)后都会重新读取这个配置文件。同时主服务器进程也将这个信号广播给所有正在运行的子服务器进程，这样现有会话也能得到新值。另外，你可以只向一个服务器进程直接发送信号。有些参数只能在服务器启动的时候设置；对这些条目的修改将被忽略，直到下次服务器重启。</p>
<p>第二种设置这些配置参数的方法是把它们作为命令行参数传递给 <tt class="COMMAND">postgres</tt> ，比如：</p>
<pre class="PROGRAMLISTING">postgres -c log_connections=yes -c log_destination='syslog'</pre>
<p>命令行选项覆盖 <tt class="FILENAME">postgresql.conf</tt> 中的选项。请注意，这意味着你不能通过编辑 <tt class="FILENAME">postgresql.conf</tt> 在运行时改变其数值，因此，虽然命令行方法很方便，但会付出灵活性的代价。</p>
<p>有时候，给某一个特定会话一个命令行参数也是很有用的。可以在客户端使用环境变量 <tt class="ENVAR">PGOPTIONS</tt> 来实现这个目的(可以用于任何基于 <span class="APPLICATION">libpq</span> 的客户端应用，不光是 <span class="APPLICATION">psql</span>)：</p>
<pre class="PROGRAMLISTING">env PGOPTIONS='-c geqo=off' psql</pre>
<p>请注意，这个变量对那些需要在服务器启动后固定的选项或者必须在 <tt class="FILENAME">postgresql.conf</tt> 里声明的选项是无效的。</p>
<p>并且，我们可以给一个用户或者一个数据库赋予一套选项设置。在一个会话开始的时候，装载所涉及到的用户和数据库的缺省设置。命令 <a href="sql-alteruser.html"><i>ALTER USER</i></a> 和 <a href="sql-alterdatabase.html"><i>ALTER DATABASE</i></a> 分别用于配置这些设置。针对每个数据库的设置将覆盖任何从 <tt class="COMMAND">postgres</tt> 命令行或者配置文件收到的设置，然后接着又被针对每个用户的设置覆盖；最后又会都被针对每个会话的设置覆盖。</p>
<p>一些选项可以在独立的 SQL 会话中修改，方法是使用 <a href="sql-set.html"><i>SET</i></a> 命令，比如：</p>
<pre class="SCREEN">SET ENABLE_SEQSCAN TO OFF;</pre>
<p>如果允许用 <tt class="COMMAND">SET</tt> 设置，这种针对每个数据库的设置将覆盖任何来自其它方面的设置。有些参数不能通过 <tt class="COMMAND">SET</tt> 改变：比如，如果这些选项不重启动 PostgreSQL 就无法合理控制其行为。同样，有些参数只能由超级用户通过 <tt class="COMMAND">SET</tt> 或 <tt class="COMMAND">ALTER</tt> 修改，而普通用户不能修改。</p>
<p><a href="sql-show.html"><i>SHOW</i></a> 命令允许检查所有参数的当前值。</p>
<p>我们也可以用虚表 <tt class="STRUCTNAME">pg_settings</tt>(在<a href="view-pg-settings.html">节43.44</a>)里描述)来显示和更新当前会话的运行时参数。它等效于 <tt class="COMMAND">SHOW</tt> 和 <tt class="COMMAND">SET</tt> ，但是用起来更方便，因为它可以和其它表连接起来使用，或者用任意用户需要的选择条件来查询。</p>
</div>
<div>
<hr align="LEFT" width="100%">
<table summary="Footer navigation table" width="100%" border="0" cellpadding="0" cellspacing="0">
<tr><td width="33%" align="left" valign="top"><a href="runtime-config.html" accesskey="P">后退</a></td><td width="34%" align="center" valign="top"><a href="index.html" accesskey="H">首页</a></td><td width="33%" align="right" valign="top"><a href="runtime-config-file-locations.html" accesskey="N">前进</a></td></tr>
<tr><td width="33%" align="left" valign="top">服务器配置</td><td width="34%" align="center" valign="top"><a href="runtime-config.html" accesskey="U">上一级</a></td><td width="33%" align="right" valign="top">文件位置</td></tr>
</table>
</div>
</body></html>